package com.neutech.maplestory.entity;

import com.neutech.maplestory.client.MapleStoryClient;
import com.neutech.maplestory.constant.Constant;
import com.neutech.maplestory.util.ImageUtil;

import java.awt.*;
import java.util.List;
import java.util.Random;

/**
 * 弓箭的方法
 *
 * ·@author：冯。
 * ·@version：v.1.0。
 * ·@docroot：表示产生文档的根路径。
 * ·@param：方法的参数类型。
 * ·@return：方法的返回类型。
 */
public class Arrow extends AbstractMapleStoryObject{
    public static  Image[] imgs = {
            ImageUtil.getImage("hero_right_arrow"),
            ImageUtil.getImage("hero_left_arrow")
    };

    public Arrow(){
        this.live = true;
        this.speed = 40;
        this.width = imgs[0].getWidth(null);
        this.height = imgs[0].getHeight(null);
    }
    public Arrow(MapleStoryClient msc,int x, int y, Direction dir){
        this();
        this.msc = msc;
        this.x = x;
        this.y = y;
        this.dir = dir;

    }

    @Override
    public void draw(Graphics g) {
        if(!live){
            msc.arrows.remove(this);
            return;
        }
        switch (dir){
            case RIGHT:
                g.drawImage(imgs[0],x,y,null);
                break;
            case LEFT:
                g.drawImage(imgs[1],x,y,null);
                break;
            default:
                break;
        }
        move();
    }

    @Override
    public void move() {
        switch (dir){
            case RIGHT:
                this.x += speed;
                break;
            case LEFT:
                this.x -= speed;
                break;
            default:
                break;
        }
        OutOfBound();
    }

    /**
     * 出界判断
     */
    private void OutOfBound(){
        if (this.x < -500 || this.x > Constant.GAME_WIDTH + 500){
            this.live = false;
        }
    }

    /**
     *随机数   随机掉落道具
     */
    public static Random r = new Random();

    /**
     * 弓箭打怪物的方法   碰撞检测
     * @param mob 被击中的怪
     * @return 是否击中
     */
    private boolean hit(Mob mob){
        //1.if判断中加上this.live   因为程序中每40毫秒进行一次碰撞检测，当弓箭碰撞怪物图片时，
        //执行弓箭为false时的语句（this.live = false）会有一定的时间，在这个时间之间，40ms内又进行了一次碰撞检测
        //所以HP的值一下减少了20

        if (this.live && this.getRectangle().intersects(mob.getRectangle()) && mob.action != Action.DIE){
            this.live = false; //2.然后if判断中判断弓箭是否为false，为false后不再进行碰撞检测
           // msc.hero.hitValue = r.nextInt(msc.hero.ATT - 5) + 8; //随机数 8 - 12
            msc.hero.hitValue = (int) (msc.hero.ATT * (1 + r.nextDouble()));//随机 1倍 - 2倍的值

            //创建出伤害值
            Power power = new Power(msc,mob.x,mob.y);
            msc.powers.add(power);
            mob.HP -= power.value;

            if (mob.HP <= 0){
                mob.action = Action.DIE;
                //当怪物死亡加经验值
                msc.hero.EXP += 50;
                if (msc.hero.EXP >= 100){
                    msc.hero.LV += 1;
                    msc.hero.EXP = 0;
                }
                if (r.nextInt(100) < 80){
                    Item item = new Item(msc,mob.x + mob.width/2- 14 ,mob.y + mob.height - 30,r.nextInt(4));
                    msc.items.add(item);
                }
                //mob.live = false;
            }
            return true;
        }
        return false;
    }

    /**
     * 一只弓箭与所有的怪物进行碰撞检测的方法
     * @param mobs  怪物容器
     * @return  是否击中
     */
    public void hit(List<Mob> mobs){
        for (int i = 0; i < mobs.size(); i++) {
            Mob mob = mobs.get(i);
            if(hit(mob)){
               // return true;
            }
        }
       // return false;
    }

}
